/** 
 * @main Plik naglowkowy klasy Wielomian, zawiera takze deklaracje funkcji 
 * zaprzyjaznionych i pomocniczych
 * @file    wielomian.h
 * @author  Grzegorz Sejnota
 *
 * @created on 28 listopad 2008, 23:28
 * @version 0.0001
 */

#ifndef _WIELOMIAN_H
#define	_WIELOMIAN_H

#include <vector>
#include <complex>


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++ POCZĄTEK  [klasy wielomian] +++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/** Klasa wielomian, klasa odzwierciedlająca wielomian o rzeczywistych współczynnikach,
 *  zbudowana w oparciu o kontener z biblioteki standardowej <vector>. Klasa umożliwia
 *  podstawowe operacje na wielomianach - sumowanie, odejmowanie, mnożenie, dzielenie oraz
 *  zwracajanie reszty z dzielenia wielomianu przez wielomian. Klasa została wyposożona 
 *  w szereg konstruktorów oraz w metodę pozwalającą utworzyć wielomian z postaci 
 *  iloczynowej.
 *  Wielomian w postaci:
 *      w(x)  =  an*x^n + ... + a2*x^2 + a1*x^1 + a0
 *
 *  Przeładowany operator(double argument) zwraca wartość wielomianu dla argumentu typu
 *  double, a operator[int indeks] odwoluje się do wspolczynnika wielomianu przy
 *  potędze indeks.
 */
class Wielomian{
    
    ///wspolczynniki wielomianu 
    std::vector<double> wspolczynniki;
    
    ///stopien wielomianu
    int stopien;
    
    //deklaracje przyjaźni z przeładowanymi operatorami
    friend bool operator== ( const Wielomian &, const Wielomian & );
    friend bool operator!= ( const Wielomian &, const Wielomian & );
    friend std::ostream & operator<< (std::ostream &, const Wielomian &);
    friend std::istream & operator>> (std::istream &, Wielomian &);
    friend Wielomian operator+ ( const Wielomian &, const Wielomian &);
    friend Wielomian operator- ( const Wielomian &, const Wielomian &);
    friend Wielomian operator- ( const Wielomian &);
    friend Wielomian operator* ( const Wielomian &, const Wielomian &);
    friend Wielomian operator/ ( const Wielomian &, const Wielomian &);
    friend Wielomian operator% ( const Wielomian &, const Wielomian &);
    
public:
    /* bezargumentowy konstruktor wielomianu pustego.*/
    Wielomian();
    
    /* destruktor */
    ~Wielomian();
    
    /* konstruktor wielomianu o jednym elemencie, liczby rzeczywistej.*/
    Wielomian (double wspA0);
    
    /* konstruktor wielomianu o rozmiarze stopien wypelniajac go wartoscią.*/
    Wielomian(int stopien, double wartosc);
    
    /* konstruktor tworzacy wielomian z tablicy double o rozmiarze stopien.*/
    Wielomian(int stopien, double *tablicaWsp);
    
    /* konstruktor tworzący wielomian z wektora współczynników.*/
    Wielomian( std::vector <double> &wektorWsp );
    
    /* konstruktor tworzący wielomian o stopniu stopien, pobierający wartosci
     *  współczynników z klawiatury.*/
    Wielomian( int stopien );
    
    /* konstruktor kopiujący.*/
    Wielomian ( const Wielomian &wzor);
    
    /* funkcja przeładowanego operatora przypisania = .*/
    Wielomian & operator=(const Wielomian &wzor );
    
    /* funkcja usuwająca zbedne zera.*/
    void usunZera();
    
    /* funkcja wyznaczająca wartość wielomianu dla argumentu przy uzyciu 
     *  schematu hornera.*/
    double operator()(double argument) const;
    
    /*funkcja przeładowanego operatora nawiasowego dla argumentów zespolonych.*/
    std::complex<double> operator()( std::complex<double> argument ) const;
               
    /* funkcja pobierająca wartośc współczynnika o indeksie wspIndeks, można 
     *  przy jej użyciu wstawiać nowe wartości współczynnika (stanowi L-wartosc).*/
    double &operator[](unsigned int wspIndex);
    
    /* przeładowany operator += .*/
    Wielomian operator+=( const Wielomian & w);
               
    /* przeładowany operator -= .*/
    Wielomian operator-=( const Wielomian & w);
    
    /* przeładowany operator *= .*/
    Wielomian operator*=( const Wielomian & w);
    
    /* przeładowany operator /= .*/
    Wielomian operator/=( const Wielomian & w);
    
    /* funkcja wyznaczająca k-tą pochodną wielomianu.*/
    Wielomian pochodna( int k ) const;
    
    /* funkcja normalizujaca wspolczynniki wielomianu*/
    Wielomian normalizujWielomian( double wspNormalizacji ) const;
   
    /* funkcja wyznaczająca pierwiastki wielomianu metodą Bairstowa.*/
    std::vector<std::complex<double> > pierwiastkiB( double dokladnosc, double p0, double q0) const;
    
    /* funkcja wyznaczająca pierwiastki wielomianu metodą Laguerre'a.*/
    std::vector<std::complex<double> > pierwiastkiL( double dokladnosc, std::complex<double> a0) const;
    
    /* funkcja wypisująca wielomian na ekran.*/
    void wypisz() const;
    
    /* funkcja zwracająca stopien wielomianu.*/
    int pobierzStopien() const;
	
	/* funkcja zwracająca wsp wielomianu.*/
	double pobierzWsp( unsigned int ) const;
    
    /* funkcja zwracająca iterator do vectora wspolczynnikow */
    std::vector<double>::iterator pobierzIteratorPoczatek();
    
    /* funkcja zwracająca iterator do vectora wspolczynnikow */
    std::vector<double>::iterator pobierzIteratorKoniec();
    
};
//-----------------------------------------------------------------------------
//-------------- KONIEC [klasa wielomian] -------------------------------------
//-----------------------------------------------------------------------------

 
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++ POCZĄTEK [deklaracji funkcji pomocniczych] ++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

/* funkcja przeładowanego operatora wypisanie wielomianu do strumienia.*/
std::ostream &operator<<(std::ostream &cout, const Wielomian & w);

/* funkcja przeładowanego operatora dodawania dwuargumentowego. */
 Wielomian  operator+( const Wielomian & w1, const Wielomian & w2);
 
/* funkcja przeładowanego operatora odejmowania dwuargumentowego.*/
 Wielomian  operator-( const Wielomian & w1, const Wielomian & w2);
 
/* funkcja przeładowanego operatora mnożenia.*/
 Wielomian operator*( const Wielomian & w1, const Wielomian & w2);
 
/*funkcja przeładowanego operatora odejmowania jednoargumentowego (odwrócenie 
  * wielomianu).*/
 Wielomian operator-( const Wielomian & w);
 
/* funkcja przeładowanego operatora dzielenia.*/
 Wielomian operator/( const Wielomian & w1, const Wielomian & w2);
 
/* funkcja tworząca wielomian z postaci iloczynowej.*/
 Wielomian postacIloczynowa();
 
/* funkcja tworząca wielomian z postaci iloczynowej.*/
 Wielomian postacIloczynowa( std::vector<double> pierwiastki);

//------------------------------------------------------------------------------
//-------------- KONIEC [funkcje pomocnicze] -----------------------------------
//------------------------------------------------------------------------------

#endif	/* _WIELOMIAN_H */

